#ifndef _PACKET_H
#define _PACKET_H

//////////////////////// common.h
//*
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
//*/
#include <string.h>
////////////////////////内部 import.h
#include "Tools.h"
#include "Lzw.h"
////////////////////////include *.h
/*in Lzw.h
//保证对应大小对齐
#define auto_nmemb(a, b) ({ \
		typeof(a) _a = (a) , _b = (b); \
		( (a) < (b) ) ?	(a) : (b) ;	\
	})
*/

/*
	打包魔术头_HEADER
*/
#define FILE_HEADER "DMSJKv1"
#define FILE_HEADER_LEN 7

///////////////////////////////////WINDOWS
#if _WIN32 || _WIN64

#include <windows.h>// -- tools.h
#include <Shlwapi.h>
// 链接shlwapi库，用于路径操作
#pragma comment(lib, "Shlwapi.lib")
// 启用Windows长路径支持-不清楚到底有没有用，先留着。
#pragma comment \
(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

/////////////////////// 缓冲区大小，用于文件读写
//#define BUFFER_SIZE 4096 // in tools.h

//windows define.
// 打包_目录
void pack_directory(const wchar_t* root_dir, const wchar_t* output_file, const char flag);
// 解包_目录
void unpack_directory(const wchar_t* pack_file, const wchar_t* output_dir, const char flag);
// 递归遍历_目录
void traverse_dir(const wchar_t* base_path, const wchar_t* rel_path, FILE* pack_file,const char flag);
// 写入_目录条目
void write_dir_entry(FILE* pack_file, const wchar_t* base_path, const wchar_t* rel_path);
// 写入_文件条目
void write_file_entry(FILE* pack_file, const wchar_t* base_path, const wchar_t* rel_path,const char flag);

/* tools by myself.
*/
// 多级目录创建函数_pro
void CreateDirectoryRecursive(const wchar_t* path);
// 路径处理函数_去除文件
void PathRemoveFileRecursive(wchar_t* );
/* 安全编码转换函数——目前移至tools.h中
char* WideToUTF8(const wchar_t* wide_str);
wchar_t* UTF8ToWide(const char* utf8_str, uint32_t utf8_len);
wchar_t* AgrvToWide(const char* ansic_str, uint32_t ansic_len);
*/
// 动态路径构建函数
wchar_t* BuildFullPath(const wchar_t* base, const wchar_t* rel);

////////////////////LINUX
#else //LINUX

#include <dirent.h>
#include <sys/stat.h>
#include <unistd.h>
/* TODO (dmsj#2#): PATH_MAX 等value为定值，不利于处
                   理突发情况，[如path过长，致使栈溢
                   出等问题]，需使用dynastic value
                   replace，后期改进 */
#undef PATH_MAX
#define PATH_MAX 4096

//linux define.
// 递归遍历目录
void re_mkdir(const char *);
// 打包目录
void su_pack(const char *base_dir, const char *current_dir
             , FILE *);
// 解包目录
void un_pack(FILE *, const char *output_dir);

#endif 	//Different case in Linux & Windows .

#endif /*_PACKET_H*/